﻿import { Injectable } from '@angular/core';
import { AppAuthService } from '@app/shared/common/auth/app-auth.service';
import { AppUrlService } from '@shared/common/nav/app-url.service';
import { AccountServiceProxy, ImpersonateInput, ImpersonateOutput } from '@shared/service-proxies/stock-service-proxies';

@Injectable()
export class ImpersonationService {
    constructor(
        private _accountService: AccountServiceProxy,
        private _appUrlService: AppUrlService,
        private _authService: AppAuthService
    ) {}

    impersonate(userId: number, tenantId?: number): void {
        const input = new ImpersonateInput();
        input.userId = userId;
        input.tenantId = tenantId;

        this._accountService.impersonate(input).subscribe((result: ImpersonateOutput) => {
            this._authService.logout(false);

            let targetUrl =
                this._appUrlService.getAppRootUrlOfTenant(result.tenancyName) +
                '?impersonationToken=' +
                result.impersonationToken;
            if (input.tenantId) {
                targetUrl = targetUrl + '&tenantId=' + input.tenantId;
            }

            location.href = targetUrl;
        });
    }

    backToImpersonator(): void {
        this._accountService.backToImpersonator().subscribe((result: ImpersonateOutput) => {
            this._authService.logout(false);

            let targetUrl =
                this._appUrlService.getAppRootUrlOfTenant(result.tenancyName) +
                '?impersonationToken=' +
                result.impersonationToken;
            if (abp.session.impersonatorTenantId) {
                targetUrl = targetUrl + '&tenantId=' + abp.session.impersonatorTenantId;
            }

            location.href = targetUrl;
        });
    }
}
